# coding=utf-8
# 操作函数文件
from scrapy import Selector
from lxml import etree
from bs4 import BeautifulSoup

import re
import lxml


def read_urls(file_path):
    """读取论坛网站网址文件，返回url列表"""
    # 读取网址文件
    txt = open(file_path, mode="r").read()
    # 切片获取url列表
    urls = txt.split(sep="\n")

    # 获取url的dns（域名）
    # for url in urls:
    #     print(url)
    #     print(url[7:].split(sep="/")[0])
    return urls


def read_re_str(file_path):
    """读取HTML去噪正则表达式"""
    re_str = open(file_path, mode="r").read()
    return re_str


def delete_html_noise(noise_re_str, response):
    """使用正则表达式进行HTML去噪"""
    html = Selector(response=response).xpath("/html").extract()[0]
    # 使用正则表达式进行匹配替换
    denoise_str = re.compile(pattern=noise_re_str, flags=re.I).sub("", html)
    return denoise_str


def extract_title(html):
    """提取帖子标题"""
    # 提取网页主题内容
    head_title = etree.HTML(text=html).xpath("//title")[0].text
    # 以分隔符-_|进行切片分割
    title_str = re.compile(pattern="[-_|]").split(string=head_title)[0].strip()
    # 提取网页中所有的标题内容
    hi_list = re.compile(pattern="<h[1-6][^>]*?>([\s\S]*?)</h[1-6]>", flags=re.I).findall(string=html)
    # print(hi_list)
    for hi in hi_list:
        hi_str = hi.strip()
        # 标题是否包含主题
        if hi_str.find(title_str) != -1:
            return title_str
        # 主题是否包含标题
        if title_str.find(hi_str) != -1:
            return hi_str
        pass
    pass


def extract_time(html, time_re_str):
    """提取主帖和回帖时间"""
    post_reply_time_re = time_re_str
    # 按照正则表达式规则匹配网页中所有符合时间格式的数据
    post_reply_time_list = re.compile(pattern=post_reply_time_re).findall(string=html)
    if len(post_reply_time_list) > 0 :
        # 返回以元组为元素的时间格式列表
        return post_reply_time_list


def read_model(file_path):
    """读取模板文件，返回模板列表"""
    txt = open(file_path, mode="r").read()
    # 以,\n作为分隔符进行分割
    model = txt.split(sep=",\n")
    # 返回模板列表
    return model


def extract_author(html, author_model):
    """提取主帖和回帖作者"""
    # 使用BeautifulSoup将HTML文件解析为DOM树
    html_bs = BeautifulSoup(markup=html, features="lxml")
    post_reply_author_class_list = author_model
    # 遍历模板列表，匹配符合网页的模板
    for post_reply_author_class in post_reply_author_class_list:
        # 按照标签类选择器搜索所有符合的标签
        post_reply_author_list = html_bs.find_all(class_=post_reply_author_class)
        # post_reply_author_list = html_bs.select("." + post_reply_author_class)
        # 以搜索返回的列表不为空来判断模板匹配成功
        if len(post_reply_author_list) > 0:
            # print(post_reply_author_class)
            return post_reply_author_list
    pass


def extract_content(html, content_model):
    """提取主帖和回帖内容"""
    # 使用BeautifulSoup将HTML文档解析为DOM树
    html_bs = BeautifulSoup(markup=html, features="lxml")
    post_reply_content_div_class_list = content_model
    # 遍历模板列表，匹配符合网页的模板
    for post_reply_content_div_class in post_reply_content_div_class_list:
        # 按照标签名称div和类选择器搜索所有符合的标签
        post_reply_content_list = html_bs.find_all(name="div", class_=post_reply_content_div_class)
        # 以搜索返回的列表不为空来判断模板匹配成功
        if len(post_reply_content_list) > 0:
            return post_reply_content_list
    pass
